export interface UDIInfo {
  di: string; // 器械标识
  pi: string; // 生产标识
}

export interface ScanOptions {
  scanType?: ('qrCode' | 'barCode' | 'datamatrix')[];
  showAlbum?: boolean;
  onSuccess?: (udiInfo: UDIInfo) => void;
  onError?: (error: string) => void;
  onLoading?: (loading: boolean) => void;
}

export function useScanUDI(options: ScanOptions = {}) {
  const {
    scanType = ['qrCode', 'barCode', 'datamatrix'],
    showAlbum = true,
    onSuccess,
    onError,
    onLoading,
  } = options;

  // 状态管理
  const loading = ref(false);
  const errorMsg = ref('');
  const rawCode = ref('');
  const udiInfo = ref<UDIInfo>({ di: '', pi: '' });

  /**
   * 开始扫码
   */
  const startScan = () => {
    resetState();

    uni.scanCode({
      scanType,
      showAlbum,
      success: res => {
        rawCode.value = res.result.replace(/\u001c|\u001d|\u001e|\u001f/g, '');
        loading.value = true;
        onLoading?.(true);

        // 分步处理：解析 UDI -> 查询产品信息
        setTimeout(() => {
          parseUDICode(rawCode.value);
        }, 3000);
      },
      fail: err => {
        const error = err.errMsg.includes('cancel') ? '已取消扫码' : '扫码失败，请检查权限或重试';

        errorMsg.value = error;
        onError?.(error);
        console.error('扫码错误:', err);
      },
    });
  };

  /**
   * 工具函数：Base64字符串转ArrayBuffer
   */
  const base64ToBuffer = (base64Str: string): ArrayBuffer => {
    // 处理URL安全的Base64（替换特殊字符）
    base64Str = base64Str.replace(/-/g, '+').replace(/_/g, '/');

    // 补全Base64填充符
    const padLength = (4 - (base64Str.length % 4)) % 4;
    base64Str += '='.repeat(padLength);

    // 浏览器环境：使用atob转换（H5/小程序兼容）
    const binaryStr = atob(base64Str);

    // 转为Uint8Array
    const buffer = new Uint8Array(binaryStr.length);
    for (let i = 0; i < binaryStr.length; i++) {
      buffer[i] = binaryStr.charCodeAt(i);
    }
    return buffer.buffer;
  };

  /**
   * 解析 UDI 码
   */
  const parseUDICode = (code: string) => {
    udiInfo.value = { di: '', pi: '' };

    // 1. 识别 GS1 标准（最常用，以 01 为 DI 标识符）
    if (isGS1Code(code)) {
      parseGS1Code(code);
    }
    // 2. 识别 HIBC 标准（以 + 分隔）
    else if (isHIBCode(code)) {
      parseHIBCode(code);
    }
    // 3. 识别 JSON 格式（键值对明确）
    else if (isJsonCode(code)) {
      parseJsonCode(code);
    }
    // 4. 自定义分隔符格式（如 | 或 ,）
    else if (code.includes('|') || code.includes(',')) {
      parseSeparatorCode(code);
    }
    // 5. 无法识别的格式（全量作为 DI）
    else {
      udiInfo.value.di = code;
      udiInfo.value.pi = '未识别编码体系';
    }

    // 解析完成后调用成功回调
    loading.value = false;
    onLoading?.(false);
    onSuccess?.(udiInfo.value);
  };

  /**
   * 判断是否为 GS1 编码（医疗行业最常用）
   */
  const isGS1Code = (code: string): boolean => {
    const aiPattern = /^(01|10|17|21|240|30|91|92)/;
    return aiPattern.test(code);
  };

  /**
   * 解析 GS1 编码中的 DI 码
   */
  const parseGS1Code = (code: string) => {
    if (code.startsWith('01')) {
      udiInfo.value.di = code.substring(2, 2 + 14);
      udiInfo.value.pi = code.substring(16);
    } else {
      const diIndex = code.indexOf('01');
      if (diIndex !== -1) {
        udiInfo.value.di = code.substring(diIndex + 2, diIndex + 2 + 14);
        udiInfo.value.pi = code.replace(`01${udiInfo.value.di}`, '');
      } else {
        udiInfo.value.di = code;
        udiInfo.value.pi = 'GS1 格式错误（无 01 标识符）';
      }
    }
  };

  /**
   * 判断是否为 HIBC 编码
   */
  const isHIBCode = (code: string): boolean => {
    return code.includes('+') && code.split('+').length >= 2;
  };

  /**
   * 解析 HIBC 编码中的 DI 码
   */
  const parseHIBCode = (code: string) => {
    const [di, ...piParts] = code.split('+');
    udiInfo.value.di = di;
    udiInfo.value.pi = piParts.join('+');
  };

  /**
   * 判断是否为 JSON 格式（含 di 字段）
   */
  const isJsonCode = (code: string): boolean => {
    try {
      const json = JSON.parse(code);
      return json.di !== undefined;
    } catch {
      return false;
    }
  };

  /**
   * 解析 JSON 格式中的 DI 码
   */
  const parseJsonCode = (code: string) => {
    try {
      const json = JSON.parse(code);
      udiInfo.value.di = json.di;
      udiInfo.value.pi = JSON.stringify(json.pi || '');
    } catch {
      udiInfo.value.di = code;
      udiInfo.value.pi = 'JSON 解析失败';
    }
  };

  /**
   * 解析自定义分隔符格式（| 或 ,）
   */
  const parseSeparatorCode = (code: string) => {
    const separator = code.includes('|') ? '|' : ',';
    const [di, ...piParts] = code.split(separator);
    udiInfo.value.di = di;
    udiInfo.value.pi = piParts.join(separator);
  };

  /**
   * 重置状态
   */
  const resetState = () => {
    loading.value = false;
    errorMsg.value = '';
    rawCode.value = '';
    udiInfo.value = { di: '', pi: '' };
  };

  return {
    // 状态
    loading: readonly(loading),
    errorMsg: readonly(errorMsg),
    rawCode: readonly(rawCode),
    udiInfo: readonly(udiInfo),

    // 方法
    startScan,
    resetState,
    base64ToBuffer,
    parseUDICode,
  };
}
